package com.bestcem.xm.txtanls.dao.mapper;


import com.bestcem.xm.txtanls.dao.dto.RecordSentiDTO;
import com.bestcem.xm.txtanls.entity.mysql.PageRecordEntity;
import com.bestcem.xm.txtanls.entity.mysql.TxtanlRecordEntity;
import com.bestcem.xm.txtanls.service.dto.RecordSearchDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * @author xa.zhang <xa.zhang@idiaoyan.com>
 * @version v1.0
 * @date 2021/9/14 14:13
 */
@Mapper
public interface TxtanlRecordMapper {

    /**
     * 插入记录
     *
     * @param entity 原话记录查询对象
     * @return List<RecordEntity> 原话记录列表
     * @author xa.zhang
     * @date 2021/10/13 13:55
     **/
    int insertSelective(TxtanlRecordEntity entity);


    /**
     * 根据参数查询原话记录Id
     *
     * @param recordSearchDTO 原话记录查询对象
     * @return List<RecordEntity> 原话记录列表
     * @author xa.zhang
     * @date 2021/5/13 13:55
     **/
    List<String> listRecordIds(RecordSearchDTO recordSearchDTO);


    /**
     * 统计原话记录数
     *
     * @param recordSearchDTO 查询条件
     * @return 原话记录数
     * @see RecordSearchDTO
     */
    Long countRecord(RecordSearchDTO recordSearchDTO);

    /**
     * 查询原话对应的情感，并对其结果进行聚合处理
     *
     * @param recordSearchDTO 原话查询参数
     * @return List<String>
     * @author xa.zhang
     * @date 2021/5/14 13:32
     **/
    List<RecordSentiDTO> listRecordSentisGroupBySenti(RecordSearchDTO recordSearchDTO);

    /**
     * 查询原话记录的内容
     *
     * @param recordSearchDTO
     * @return List<String>
     **/
    List<String> listRecordContent(RecordSearchDTO recordSearchDTO);

    /**
     * 根据关键词查询原话记录的Id
     * 使用时注意 返回类型为{"_id": {"$oid": "60506b5e528324003c4bfa88"}}。
     * 为了性能，直接使用字符串接收，对结果不影响
     *
     * @param recordSearchDTO
     * @return List<String>
     **/
    List<String> listRecordIdByKeywords(RecordSearchDTO recordSearchDTO);


    /**
     * 根据关键词查询原话记录的数量
     *
     * @param recordSearchDTO
     * @return List<String>
     **/
    Long countRecordByKeyword(RecordSearchDTO recordSearchDTO);

    /**
     * 根据项目id查找原话记录的最小时间
     *
     * @param projectId 项目id
     * @return LocalDateTime 找不到时返回null
     **/
    Date getMinRecordTimeByProject(String projectId);

    /**
     * 获取当前文本分析项目已有原话记录中的最大时间
     *
     * @param projectId projectId 项目id
     * @return 原话记录最大record_time
     */
    Date getMaxTime(String projectId);

    Long countPageRecord(PageRecordEntity pageRecordEntity);

    List<TxtanlRecordEntity> selectPageRecord(PageRecordEntity pageRecordEntity);

    /**
     * 根据项目id获取一条原话记录
     *
     * @param projectId
     * @return
     */
    TxtanlRecordEntity getRecordByProjectId(String projectId);


    /**
     * 删除分析项目下的全部话题
     *
     * @param projectId 项目id
     * @return The result of a delete operation
     */
    int deleteProjectAllRecord(String projectId);

    // ================== 异步训练用 ==================

    /**
     * 查询项目下所有原话的数量
     *
     * @param projectId 项目id
     * @return The number of all records in the project
     */
    Long countProjectAllRecord(String projectId);

    /**
     * 查询项目对应字段下所有原话的数量
     *
     * @param projectId 项目id
     * @return The number of all records in the field
     */
    long countProjectFieldRecord(@Param("projectId") String projectId, @Param("fieldId") String fieldId);

    /**
     * 查询项目对应字段原话记录的最大 collection_time
     *
     * @param projectId 项目id
     * @param fieldId   字段id
     * @return Field record max collection_time
     */
    Date findMaxCollectionTime(@Param("projectId") String projectId, @Param("fieldId") String fieldId);

    /**
     * 查询项目对应字段原话记录的最大 created_dt
     *
     * @param projectId 项目id
     * @param fieldId   字段id
     * @return Field record max created_dt
     */
    Date findMaxCreatedDt(@Param("projectId") String projectId, @Param("fieldId") String fieldId);


    /**
     * 查询文本分析项目所有原话
     * @param projectId
     * @return
     */
    List<TxtanlRecordEntity> listRecordByProjectId(String projectId);

    /**
     * 创建表
     *
     * @param tableName 表名称
     * @author jy.zhao
     * @date 2022/02/24 18:32
     **/
    int createNewTable(@Param("tableName") String tableName);
}